package com.zhoux.collections.map;

import java.util.*;

/**
 * @author taoyi
 * @version 1.0
 * @date 2021/3/13 14:29
 *
 * 本类用于测试 Map 集合
 * Map 集合没有继承 Collection 接口，其提供的是 key 到 value 的映射。
 * Map 中不能包含相同的 key，每个key只能映射一个value。
 * key 还决定了存储对象在映射中的存储位置，但不是有key对象本身决定的，
 * 而是通过一种“散列技术”进行处理，产生一个散列码的整数值。
 * 散列码通常用于作一个偏移量，该偏移量对应分配给映射的内存区域的起始位置，
 * 从而确定存储对象在映射中的存储位置。
 * Map 集合包括 Map 接口以及 Map接口的所有实现类。
 *
 * Map 接口的实现类：
 * 1.HashMap <null,null>:我们最常用的Map，它根据key的HashCode 值来存储数据,根据key可以直接获取它的Value，
 *         同时它具有很快的访问速度。HashMap最多只允许一条记录的key值为Null(多条会覆盖);
 *         允许多条记录的Value为 Null。非同步的。
 *
 * 2.TreeMap <key,null>:能够把它保存的记录根据key排序,默认是按升序排序，也可以指定排序的比较器，
 *         当用Iterator 遍历TreeMap时，得到的记录是排过序的。TreeMap不允许key的值为null。非同步的。
 *
 * 3.Hashtable  <key,value>:与HashMap类似,不同的是:key和value的值均不允许为null;
 *            它支持线程的同步，即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢。
 *
 * 4.LinkedHashMap  <null,null>:保存了记录的插入顺序，在用Iterator遍历LinkedHashMap时，
 *               先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。key和value均允许为空，非同步的。
 *
 */
public class Map_Test {
    public static void main(String[] args) {
        Map<String, String> map = new TreeMap<String, String>(); // 创建 Map 实例
        map.put("1001","李同学"); // 向集合中添加对象
        map.put("1004","周同学"); // 向集合中添加对象
        map.put("1003","张同学"); // 向集合中添加对象
        map.put("1002","王同学"); // 向集合中添加对象
        Set<String> set = map.keySet(); // 构建 Map 集合中所有 key 对象的集合
        Iterator<String> iterator = set.iterator(); // 创建集合迭代器
        System.out.println("key 集合中的元素：");
        while (iterator.hasNext()){ // 遍历集合key
            String key = iterator.next();
            System.out.println("{"+key+":"+map.get(key)+"}");
        }
        Collection<String> collection = map.values(); // 构建 Map 集合中所有 value 值的集合
        iterator = collection.iterator();
        System.out.println("values 集合中的元素：");
        while (iterator.hasNext()){ // 遍历集合values
            System.out.println(iterator.next());
        }

        Set<Map.Entry<String,String>> entrySet = map.entrySet();
        Iterator<Map.Entry<String,String>> it = entrySet.iterator();
        while (it.hasNext()){
            Map.Entry<String,String> entry = it.next();
           System.out.println("{"+entry.getKey()+":"+entry.getValue()+"}");
        }
    }
}


